package com.lazycat.leetcode.editor.cn;
//2023-07-19 21:13:45
//在经典汉诺塔问题中，有 3 根柱子及 N 个不同大小的穿孔圆盘，盘子可以滑入任意一根柱子。一开始，所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只
//能放在更大的盘子上面)。移动圆盘时受到以下限制: (1) 每次只能移动一个盘子; (2) 盘子只能从柱子顶端滑出移到下一根柱子; (3) 盘子只能叠在比它大的盘
//子上。 
//
// 请编写程序，用栈将所有盘子从第一根柱子移到最后一根柱子。 
//
// 你需要原地修改栈。 
//
// 示例1: 
//
//  输入：A = [2, 1, 0], B = [], C = []
// 输出：C = [2, 1, 0]
// 
//
// 示例2: 
//
//  输入：A = [1, 0], B = [], C = []
// 输出：C = [1, 0]
// 
//
// 提示: 
//
// 
// A中盘子的数目不大于14个。 
// 
//
// Related Topics 递归 数组 👍 221 👎 0

import java.util.ArrayList;
import java.util.List;

class HanotaLcci {
    public static void main(String[] args) {
        //创建该题目的对象方便调用
        Solution solution = new HanotaLcci().new Solution();
        List<Integer> A = new ArrayList<>();
        List<Integer> B = new ArrayList<>();
        List<Integer> C = new ArrayList<>();
        A.add(2);
        A.add(1);
        A.add(0);
        solution.hanota(A,B,C);
    }
    //leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public void hanota(List<Integer> A, List<Integer> B, List<Integer> C) {
        move(A,C,B,A.size());
    }

        /**
         *
         * @param A 初始的
         * @param C 目标的
         * @param B 缓存的
         * @param n 长度
         */
    private void move(List<Integer> A,List<Integer> C,List<Integer> B,int n){
        if(n == 1){
            C.add(A.remove(A.size()-1));
            return;
        }
        move(A,B,C,n-1);    //上面n-1个，从A移动到B
        C.add(A.remove(A.size()-1));  //最底下的一个，从A移动到C
        move(B,C,A,n-1);    //上面n-1个，从B移动到C
    }
}
//leetcode submit region end(Prohibit modification and deletion)

}